package com.shuyuntu.proposal.dao.base;

import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;

import java.io.Serializable;
import java.util.List;

/**
 * Dao基本类的接口
 * Created by syt005 on 2016/4/13.
 */
public interface IBaseDao<T, PK extends Serializable> {
    /**
     * 向数据库中插入一个对象
     * @param obj 带插入对象
     * @return 主键
     */
    PK insert(T obj);

    /**
     * 从数据库中删除一个对象
     * @param obj 待删除对象
     * @return true/false
     */
    boolean delete(T obj);

    /**
     * 根据主键删除一个对象
     * @param id 待删除对象的主键
     * @return true/false
     */
    boolean deleteById(PK id);

    /**
     * 从数据库中更新一个对象
     * @param obj 待更新对象
     * @return true/false
     */
    boolean update(T obj);

    /**
     * 添加或创建一个对象
     *
     * 首先判断对象是否已被创建，
     * 如果没有则创建一个新的对
     * 象，如果已经创建，则更新
     * 这个对象
     *
     * @param obj 待插入/更新的对象
     * @return true/false
     */
    boolean insertOrUpdate(T obj);

    /**
     * 查询符合条件的条目数
     *
     * @param criterions 查询的条件
     * @return 条目数
     */
    long queryCount(Criterion... criterions);

    /**
     * 根据主键返回对象
     *
     * @param id 主键
     * @return 该对象
     */
    T queryById(PK id);

    /**
     * 根据指定的条件，返回第一条对象
     *
     * @param order 排序方式
     * @param criterions 约束条件
     * @return 返回的第一条对象
     */
    T queryFirst(Order order, Criterion... criterions);

    /**
     * 条件查询
     * @param criterions 约束条件
     * @return 对象集合
     */
    List<T> queryList(Criterion... criterions);

    /**
     * 排序条件查询
     * @param order 排序方式
     * @param criterions 约束条件
     * @return 对象集合
     */
    List<T> queryList(Order order, Criterion... criterions);

    /**
     * 按序分页条件查询
     * @param pageNo 页码
     * @param pageSize 分页大小
     * @param rowCount 符合条件的记录总数
     * @param order 排序方式
     * @param criterions 约束条件
     * @return 对象集合
     */
    List<T> queryPageList(int pageNo, int pageSize, StringBuffer rowCount, Order order, Criterion... criterions);

    /**
     * 根据条件获取最大值
     * @param propertyName 字段名
     * @param criterions 约束条件
     * @return 最大值
     */
    Object queryMax(String propertyName, Criterion... criterions);

    /**
     * 通过自定义的hql语句，返回集合
     * @param hql 自定义hql语句
     * @return 对象集合
     */
    List<T> queryListByHql(String hql);
}